﻿<?php
/* *
 * 功能：支付宝服务器异步通知页面
 * 版本：3.3
 * 日期：2012-07-23
 * 说明：
 * 以下代码只是为了方便商户测试而提供的样例代码，商户可以根据自己网站的需要，按照技术文档编写,并非一定要使用该代码。
 * 该代码仅供学习和研究支付宝接口使用，只是提供一个参考。


 *************************页面功能说明*************************
 * 创建该页面文件时，请留心该页面文件中无任何HTML代码及空格。
 * 该页面不能在本机电脑测试，请到服务器上做测试。请确保外部可以访问该页面。
 * 该页面调试工具请使用写文本函数logResult，该函数已被默认关闭，见alipay_notify_class.php中的函数verifyNotify
 * 如果没有收到该页面返回的 success 信息，支付宝会在24小时内按一定的时间策略重发通知
 */

define('DISABLEXSSCHECK', true);
require '../../../source/class/class_core.php';
$discuz = C::app();
$discuz->init();
$settings=C::t('#aljbd#aljbd_setting')->range();
$alipay_config['partner']		=   trim($settings['ec_partner']['value']);
if(!isset($_G['cache']['plugin'])) {
	loadcache('plugin');
}
$is_openarray = array('iswatermark','is_daohang','alipay','malipay','isextcredit','pic','isgo','isnews','isyouh','ispd','isrewrite','islogo','isqq','ista','sjurl','sj_index_lz','time');
foreach($settings as $k => $v){
	if(in_array($k,$is_openarray)){//开关判断
		if($v['value'] == 1){
			$_G['cache']['plugin']['aljbd'][$k] = 1;
		}elseif($v['value'] == 2){
			$_G['cache']['plugin']['aljbd'][$k] = 0;
		}
	}else{
		if($v['value']){
			$_G['cache']['plugin']['aljbd'][$k] = htmlspecialchars_decode($v['value']);//同名变量，有值覆盖设置中变量
		}
	}
}
//安全检验码，以数字和字母组成的32位字符
//如果签名方式设置为“MD5”时，请设置该参数
$alipay_config['key']			= $settings['ec_securitycode']['value'];

//商户的私钥（后缀是.pen）文件相对路径
//如果签名方式设置为“0001”时，请设置该参数
$alipay_config['private_key_path']	= 'source/plugin/aljbd/key/rsa_private_key.pem';

//支付宝公钥（后缀是.pen）文件相对路径
//如果签名方式设置为“0001”时，请设置该参数
$alipay_config['ali_public_key_path']= 'source/plugin/aljbd/key/alipay_public_key.pem';


//↑↑↑↑↑↑↑↑↑↑请在这里配置您的基本信息↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑


//签名方式 不需修改
$alipay_config['sign_type']    = 'MD5';

//字符编码格式 目前支持 gbk 或 utf-8
$alipay_config['input_charset']= 'utf8';

//ca证书路径地址，用于curl中ssl校验
//请保证cacert.pem文件在当前文件夹目录中
$alipay_config['cacert']    = getcwd().'/source/plugin/aljbd'.'\\cacert.pem';

//访问模式,根据自己的服务器是否支持ssl访问，若支持请选择https；若不支持请选择http
$alipay_config['transport']    = 'http';

require_once("source/plugin/aljbd/lib/alipay_notify.class.php");

//计算得出通知验证结果
$alipayNotify = new AlipayNotify($alipay_config);
$verify_result = $alipayNotify->verifyNotify();
$_G['siteurl'] = 'http://'.$_SERVER['HTTP_HOST'];
if($verify_result) {//验证成功
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
	//请在这里加上商户的业务逻辑程序代

	
	//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
    //获取支付宝的通知返回参数，可参考技术文档中服务器异步通知参数列表
	
	//解析notify_data
	//注意：该功能PHP5环境及以上支持，需开通curl、SSL等PHP配置环境。建议本地调试时使用PHP开发软件
	$doc = new DOMDocument();	
	if ($alipay_config['sign_type'] == 'MD5') {
		$doc->loadXML($_POST['notify_data']);
	}
	
	if ($alipay_config['sign_type'] == '0001') {
		$doc->loadXML($alipayNotify->decrypt($_POST['notify_data']));
	}
	
	if( ! empty($doc->getElementsByTagName( "notify" )->item(0)->nodeValue) ) {
		//商户订单号
		$out_trade_no = $doc->getElementsByTagName( "out_trade_no" )->item(0)->nodeValue;
		//支付宝交易号
		$trade_no = $doc->getElementsByTagName( "trade_no" )->item(0)->nodeValue;
		//交易状态
		$trade_status = $doc->getElementsByTagName( "trade_status" )->item(0)->nodeValue;
		
		if($trade_status == 'TRADE_FINISHED') {
			//判断该笔订单是否在商户网站中已经做过处理
				//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
				//如果有做过处理，不执行商户的业务程序
					
			//注意：
			//该种交易状态只在两种情况下出现
			//1、开通了普通即时到账，买家付款成功后。
			//2、开通了高级即时到账，从该笔交易成功时间算起，过了签约时的可退款时限（如：三个月以内可退款、一年以内可退款等）后。
	
			//调试用，写文本函数记录程序运行情况是否正常
			//logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
			$order = C::t('#aljbd#aljbd_order') -> fetch($out_trade_no);
			$good = C::t('#aljbd#aljbd_goods') -> fetch($order['sid']);
			if ($order['status'] == 1){
				$status = 2;
				C::t('#aljbd#aljbd_order')->update($out_trade_no, array('status' => $status, 'buyer' => "$trade_no", 'confirmdate' => $_G['timestamp']));
				C::t('#aljbd#aljbd_goods')->update_num2_by_id($good['id'],$order['amount']);

				notification_add($order['uid'], 'system',str_replace('{username}',$order['username'],str_replace('{shopname}','<a href="plugin.php?id=aljbd&act=goodview&gid='.$good['id'].'">'.$good['name'].'</a>',$_G['cache']['plugin']['aljbd']['suctips'])));
				$brand = C::t('#aljbd#aljbd') -> fetch($good['bid']);
				notification_add($good['uid'], 'system',str_replace('{orderid}','<a href="plugin.php?id=aljbd&act=orderlist">'.$out_trade_no.'</a>',str_replace('{username}',$brand['username'],str_replace('{name}',$order['username'],str_replace('{shopname}','<a href="plugin.php?id=aljbd&act=goodview&gid='.$good['id'].'">'.$good['name'].'</a>',$_G['cache']['plugin']['aljbd']['notify_merchant'])))));
				if($_G['cache']['plugin']['aljbd']['time']){
					$email_first = C::t("common_member")->fetch($order['uid']);
					$email = $email_first['email'];
					if($email_first['email']){
						$m=str_replace('{username}',$order['username'],str_replace('{shopname}','<a href="'.$_G['siteurl'].'/plugin.php?id=aljbd&act=goodview&gid='.$good['id'].'">'.$good['name'].'</a>',$_G['cache']['plugin']['aljbd']['suctips']));
						require_once libfile('function/mail');
						sendmail_cron($email,$_G['cache']['plugin']['aljbd']['mailtitle'].'@'.gmdate('Y-m-d H:i:s',$_G['timestamp']+8*3600),$m);
					}
					$email_f = C::t("common_member")->fetch($good['uid']);
					$e = $email_f['email'];
					if($email_f['email']){
						$me=str_replace('{orderid}','<a href="'.$_G['siteurl'].'/plugin.php?id=aljbd&act=orderlist">'.$out_trade_no.'</a>',str_replace('{username}',$brand['username'],str_replace('{name}',$order['username'],str_replace('{shopname}','<a href="'.$_G['siteurl'].'/plugin.php?id=aljbd&act=goodview&gid='.$good['id'].'">'.$good['name'].'</a>',$_G['cache']['plugin']['aljbd']['notify_merchant']))));
						$t=str_replace('{orderid}',$out_trade_no,$_G['cache']['plugin']['aljbd']['notify_merchant_title']);
						require_once libfile('function/mail');
						sendmail_cron($e,$t,$me);
					}
				}
			}
			echo "success";		//请不要修改或删除
		}
		else if ($trade_status == 'TRADE_SUCCESS') {
			//判断该笔订单是否在商户网站中已经做过处理
				//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
				//如果有做过处理，不执行商户的业务程序
					
			//注意：
			//该种交易状态只在一种情况下出现——开通了高级即时到账，买家付款成功后。
	
			//调试用，写文本函数记录程序运行情况是否正常
			//logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
			
			
			dheader('location: '.$_G['siteurl'].'/plugin.php?id=aljbd&act=orderlist');
		}
	}

	//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——
	
	/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
}
else {
    //验证失败

    //调试用，写文本函数记录程序运行情况是否正常
    //logResult("这里写入想要调试的代码变量值，或其他运行的结果记录");
}
?>